package com.atguigu.tingshu.album.service.impl;

import com.atguigu.tingshu.album.mapper.AlbumAttributeValueMapper;
import com.atguigu.tingshu.album.mapper.AlbumInfoMapper;
import com.atguigu.tingshu.album.mapper.AlbumStatMapper;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.model.album.AlbumAttributeValue;
import com.atguigu.tingshu.model.album.AlbumInfo;
import com.atguigu.tingshu.model.album.AlbumStat;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.AlbumAttributeValueVo;
import com.atguigu.tingshu.vo.album.AlbumInfoVo;
import com.atguigu.tingshu.vo.album.AlbumListVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.Random;

@Slf4j
@Service
@SuppressWarnings({"all"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {

    @Autowired
    private AlbumInfoMapper albumInfoMapper;
    @Autowired
    private AlbumAttributeValueMapper albumAttributeValueMapper;
    @Autowired
    private AlbumStatMapper albumStatMapper;

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveAlbumInfo(AlbumInfoVo albumInfoVo, Long userId) {
        //创建专辑对象
        AlbumInfo albumInfo = new AlbumInfo();
        //给专辑对象赋值,相同属性进行拷贝
        BeanUtils.copyProperties(albumInfoVo, albumInfo);//vo中的属性复制给info
        albumInfo.setUserId(userId);
        //专辑类型:免费,VIP免费,付费  track_for_free
        if (!SystemConstant.ALBUM_PAY_TYPE_FREE.equals(albumInfoVo.getPayType())) {
            //这个是免费试听集数
            albumInfo.setTracksForFree(5);
        }
        albumInfo.setStatus(SystemConstant.ALBUM_STATUS_PASS);
        albumInfoMapper.insert(albumInfo);
        //保存专辑属性与值
        List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
        if (!CollectionUtils.isEmpty(albumAttributeValueVoList)) {
            //遍历
            for (AlbumAttributeValueVo albumAttributeValueVo : albumAttributeValueVoList) {
                //创建对象
                AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
                //赋值:album_id
                BeanUtils.copyProperties(albumAttributeValueVo, albumAttributeValue);
                //获取插入操作之后的主键id
                albumAttributeValue.setAlbumId(albumInfo.getId());
                //循环执行inser
                albumAttributeValueMapper.insert(albumAttributeValue);
            }
        }
        this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_PLAY);
        this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_SUBSCRIBE);
        this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_BROWSE);
        this.saveAlbumStat(albumInfo.getId(), SystemConstant.ALBUM_STAT_COMMENT);

    }

    @Override
    public IPage<AlbumListVo> findUserAlbumPage(Page<AlbumListVo> page, AlbumInfoQuery albumInfoQuery) {
        return albumInfoMapper.selectUserAlbumPage(page, albumInfoQuery);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void removeAlbumInfoById(Long albumId) {
        albumInfoMapper.deleteById(albumId);
        albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>()
                .eq(AlbumAttributeValue::getAlbumId, albumId));
        albumStatMapper.delete(new LambdaQueryWrapper<AlbumStat>()
                .eq(AlbumStat::getAlbumId, albumId));
    }

    @Override
    public AlbumInfo getAlbumInfoById(Long albumId) {
        //创建对象
        AlbumInfo albumInfo = this.getById(albumId);
        albumInfo.setAlbumAttributeValueVoList(albumAttributeValueMapper.selectList(new LambdaQueryWrapper<AlbumAttributeValue>()
                .eq(AlbumAttributeValue::getAlbumId, albumId)));
        return albumInfo;
    }

    @Override
    public void updateAlbumInfoById(Long albumId, AlbumInfoVo albumInfoVo) {
        AlbumInfo albumInfo = new AlbumInfo();
        //给专辑对象赋值,相同属性进行拷贝
        BeanUtils.copyProperties(albumInfoVo, albumInfo);
        albumInfo.setId(albumId);
        this.albumInfoMapper.updateById(albumInfo);
        //要先删除旧数据
        albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>()
                .eq(AlbumAttributeValue::getAlbumId, albumId));
        //获取修改后的数据
        List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
        if (!CollectionUtils.isEmpty(albumAttributeValueVoList)) {
            //遍历
            for (AlbumAttributeValueVo albumAttributeValueVo : albumAttributeValueVoList) {
                //创建对象
                AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
                //赋值:album_id
                BeanUtils.copyProperties(albumAttributeValueVo, albumAttributeValue);
                //获取插入操作之后的主键id
                albumAttributeValue.setAlbumId(albumInfo.getId());
                //循环执行inser
                albumAttributeValueMapper.insert(albumAttributeValue);
            }
        }
        //	album_info
        //	创建一个专辑对象
//		AlbumInfo albumInfo = new AlbumInfo();
//		//	属性拷贝：
//		BeanUtils.copyProperties(albumInfoVo, albumInfo);
//		albumInfo.setId(albumId);
//		this.albumInfoMapper.updateById(albumInfo);
//		//	album_attribute_value; 需要先删除旧数据，再新增！
//		albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId, albumId));
//		//	获取修改之后的数据
//		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
//		if (!CollectionUtils.isEmpty(albumAttributeValueVoList)){
//			//	循环遍历
//			for (AlbumAttributeValueVo albumAttributeValueVo : albumAttributeValueVoList) {
//				//	创建对象
//				AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
//				//	赋值：album_id
//				BeanUtils.copyProperties(albumAttributeValueVo, albumAttributeValue);
//				//	因为插入操作在当前代码之前 @TableId(type = IdType.AUTO) 这个属性表示能够获取到插入之后的主键Id
//				albumAttributeValue.setAlbumId(albumInfo.getId());
//				//	循环遍历执行n次insert into;
//				albumAttributeValueMapper.insert(albumAttributeValue);
//			}
//			//	可以优化变为批量保存.
//		}

    }

    @Override
    public List<AlbumInfo> findUserAllAlbumList() {
        LambdaQueryWrapper<AlbumInfo> wrapper = new LambdaQueryWrapper<AlbumInfo>()
                .select(AlbumInfo::getId, AlbumInfo::getAlbumTitle)
                .orderByDesc(AlbumInfo::getId).last(" limit 30 ");
        return albumInfoMapper.selectList(wrapper);

    }


    private void saveAlbumStat(Long albumId, String statPlay) {
        //创建对象
        AlbumStat albumStat = new AlbumStat();
        //赋值
        albumStat.setAlbumId(albumId);
        albumStat.setStatType(statPlay);
        albumStat.setStatNum(new Random().nextInt(100000));
        //保存
        albumStatMapper.insert(albumStat);
    }
}
